package yto.freemarker.java8.method;

import org.junit.Test;
import yto.freemarker.java8.entity.Employee;

import java.io.PrintStream;
import java.util.Comparator;
import java.util.function.BiPredicate;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * 方法引用：
 * Lambda表达方式的另外一种表达方式
 * <p>
 * 表现的方式：
 * (注意：Lambda体中调用的方法的参数列表与返回值类型，要与函数式接口中抽象方法的函数列表与返回值类型保持一致!)
 * <p>
 * 对象::实例方法名
 * <p>
 * 类：：静态方法名
 * <p>
 * 类::实例方法名
 * <p>
 * 注意：Lambda体中调用的方法的参数列表与返回值类型，要与函数式接口中抽象方法的函数列表与返回值类型保持一致!
 * 若Lambda参数列表中的第一参数是实例方法的调用者，而第二个参数是实例方法的参数时，可以使用ClassName：：method
 *
 * @author dongxing
 * @create 2018-06-19 13:58
 **/
public class TestMethodRef {

    /**
     * 对象::实例方法名
     */
    @Test
    public void test1() {

        PrintStream stream = System.out;
        Consumer<String> s = (x) -> stream.println(x);

        PrintStream printStream = System.out;
        Consumer<String> consumer = printStream::println;

        Consumer<String> consumer1 = System.out::println;
        consumer1.accept("你好");
    }

    /**
     * 对象::实例方法名
     */
    @Test
    public void test2() {
        Employee employee = new Employee();
        Supplier<Integer> supplier = employee::getAge;
        Integer integer = supplier.get();
        System.out.println(integer);
    }

    /**
     * 类：：静态方法名
     */
    @Test
    public void test3() {
        Comparator<Integer> com = Integer::compareTo;
        com.compare(1, 2);
    }

    /**
     * 类::实例方法名
     */
    @Test
    public void test4() {
        BiPredicate<String, String> stringStringBiPredicate = String::equals;
        boolean test = stringStringBiPredicate.test("11", "22");
        System.out.println(test);

    }

    /**
     * 构造器引用
     */
    @Test
    public void test5() {
        Supplier<Employee> supplier = Employee::new;
        Employee employee = supplier.get();
        System.out.println(employee);

    }

    /**
     * 构造器的方法
     */
    @Test
    public void test6() {
        Function<Integer, Employee> function = Employee::new;
        Employee apply = function.apply(101);
        System.out.println(apply);

    }

    /**
     * 数组引用
     */
    @Test
    public void test7() {
        Function<Integer, String[]> function = String[]::new;
        String[] apply = function.apply(20);
        System.out.println(apply.length);

    }


}
